import SockJS from 'sockjs-client'; // 导入SockJS库，用于建立WebSocket连接
import Stomp from 'stompjs'; // 导入STOMP库，用于WebSocket消息协议
import {useLoginStore} from '../../stores/index.js'

/**
 * WebSocket服务类
 * 用于管理WebSocket连接、订阅和消息发送（Cookie传递Token版）
 */
class WebSocketService {
  constructor() {
    this.stompClient = null;
    this.connected = false;
    this.subscriptions = new Map();
  }

  connect() {
    if (this.connected) return Promise.resolve();
    
    return new Promise((resolve, reject) => {
      const loginStore = useLoginStore();
      const token = "Bearer " + loginStore.token;
      if (!token) {
            reject(new Error("未获取到登录Token"));
            return;
          }
      console.log("Token:", token);

      // 1. 用相对路径（依赖 Vite 代理转发，避免硬编码端口）
      const socket = new SockJS(`/ws?token=${encodeURIComponent(token)}`, null, {
        withCredentials: true ,// 保留凭证传递
        transports: ['websocket', 'xhr-streaming', 'xhr-polling']
      });

      this.stompClient = Stomp.over(socket);

      // 2. Token 通过 STOMP 连接头传递（不再拼 URL）
      const headers = {
        'Content-Type': 'application/json',
        'Authorization': token // 关键：Token 放在头里
      };

      this.stompClient.connect(
        headers,
        () => { // 连接成功
          this.connected = true;
          console.log('WebSocket 连接成功（STOMP 头传 Token）');
          resolve();
        },
        (error) => { // 3. 修复 undefined 错误处理
          console.error('WebSocket 连接错误:', error);
          // 先判断 error 和 error.message 是否存在
          if (error && error.message) {
            if (error.message.includes('401')) {
              reject(new Error('Token 无效，请重新登录'));
            } else if (error.message.includes('404')) {
              reject(new Error('WebSocket 预检接口不存在，请检查后端 SockJS 配置'));
            } else {
              reject(error);
            }
          } else {
            reject(new Error('WebSocket 连接失败，错误信息未知'));
          }
        }
      );
    });
  }

  /**
   * 订阅指定目的地（逻辑无修改）
   * @param {string} destination - 要订阅的目的地路径
   * @param {Function} callback - 收到消息时的回调函数
   */
  subscribe(destination, callback) {
    if (!this.connected) {
      this.connect().then(() => {
        this.doSubscribe(destination, callback);
      });
    } else {
      this.doSubscribe(destination, callback);
    }
  }

  /**
   * 执行实际的订阅操作（逻辑无修改）
   * @param {string} destination - 要订阅的目的地路径
   * @param {Function} callback - 收到消息时的回调函数
   */
  doSubscribe(destination, callback) {
    const subscription = this.stompClient.subscribe(destination, (message) => {
      callback(JSON.parse(message.body));
    });
    this.subscriptions.set(destination, subscription);
  }

  /**
   * 发送消息到指定目的地（逻辑无修改）
   * @param {string} destination - 消息发送的目的地路径
   * @param {Object} body - 要发送的消息内容
   */
  send(destination, body) {
    if (!this.connected) {
      this.connect().then(() => {
        this.stompClient.send(destination, {}, JSON.stringify(body));
      });
    } else {
      this.stompClient.send(destination, {}, JSON.stringify(body));
    }
  }

  /**
   * 断开WebSocket连接（逻辑无修改）
   */
  disconnect() {
    if (this.stompClient) {
      this.subscriptions.forEach((subscription) => {
        subscription.unsubscribe();
      });
      this.subscriptions.clear();
      this.stompClient.disconnect();
      this.connected = false;
    }
  }
}

// 导出WebSocketService的单例实例
export default new WebSocketService();